package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.Date;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKTipoCambio;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.ComandoVer;
import pe.com.cotelasa.scp.controlador.comando.IComando;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBTipoCambio")
@Scope("request")
public class MBTipoCambio extends MBGenerico implements IMantenedor, Serializable {

    private static final long serialVersionUID = -3008828663507135734L;
    private static Logger logger = Logger.getLogger(MBTipoCambio.class);
    @Inject
    private BKTipoCambio bkTipoCambio;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    
    
    @Autowired
    BKSession session;

    public MBTipoCambio() {
    }

    public void buscarListaTipoCambios() {
        TipoCambio objTipoCambio = new TipoCambio();
        Date hoy = UtilitarioFecha.construirFecha(UtilitarioFecha.obtenerAnioActual(), UtilitarioFecha.obtenerMesActual(), 1);
        bkTipoCambio.setFechaInicioMes(UtilitarioFecha.formatearFecha(hoy,"yyyy-MM-dd"));
        try {
            bkTipoCambio.setListaTipoCambiosActivos(this.servicioTipoCambio.listarTipoCambiosPorFiltro(bkTipoCambio.getFechaInicio(),bkTipoCambio.getFechaFinal()));
            bkTipoCambio.getListaTipoCambiosActivos().size();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String nuevo() {
        this.bkTipoCambio.setComando(new ComandoGuardar(this));
        bkTipoCambio.setTipoCambioFormulario(new TipoCambio());
        bkTipoCambio.getTipoCambioFormulario().setFecCreacion(new Date());
        
        
        return URLPaginacion.TipoCambio.URL_FORMULARIO_TIPO_CAMBIO;
    }

    public String editar() {
        this.bkTipoCambio.setComando(new ComandoActualizar(this));
        
        return URLPaginacion.TipoCambio.URL_FORMULARIO_TIPO_CAMBIO;
    }

    public String ver() {
        //comando = new ComandoVer(this);
        return URLPaginacion.TipoCambio.URL_FORMULARIO_TIPO_CAMBIO;
    }

    public String guardar() {
        TipoCambio tipoCambio = bkTipoCambio.getTipoCambioFormulario();
        tipoCambio.setUsrCreacion(session.getUsuario().getUsuario());
        String url = "";
        try {
            if(servicioTipoCambio.ValidarTipoCambio(bkTipoCambio.getTipoCambioFormulario()) != null){
                mostrarError("Esta fecha ya ha sido registrada");
                url = URLPaginacion.TipoCambio.URL_FORMULARIO_TIPO_CAMBIO;
            }else{
                servicioTipoCambio.guardarTipoCambio(tipoCambio);
                //bkTipoCambio.setListaTipoCambiosActivos(servicioTipoCambio.listarTipoCambiosActivos());
                mostrarMensaje("Se guardo el tipo de cambio satisfactoriamente.");
                buscarListaTipoCambios();
                url = URLPaginacion.TipoCambio.URL_LISTA_TIPO_CAMBIO;
            }
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return url;
    }

    public String actualizar() {
        bkTipoCambio.getTipoCambioFormulario().setUsrCreacion(session.getUsuario().getUsuario());
        bkTipoCambio.getTipoCambioFormulario().setFecModificacion(new Date());
        try {
            servicioTipoCambio.actualizarTipoCambio(bkTipoCambio.getTipoCambioFormulario());
            bkTipoCambio.setTipoCambioFormulario(servicioTipoCambio.conseguirTipoCambioPorId(1));
            //bkTipoCambio.setListaTipoCambiosActivos(servicioTipoCambio.listarTipoCambiosActivos());
            buscarListaTipoCambios();
            mostrarMensaje("Se actualizaron los datos del tipo de cambio satisfactoriamente.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.TipoCambio.URL_LISTA_TIPO_CAMBIO;
    }

    public String mostrarMantenimiento() {
        bkTipoCambio.setFechaInicio(null);
        bkTipoCambio.setFechaFinal(null);
        bkTipoCambio.setListaTipoCambiosActivos(null);
        
        
        return URLPaginacion.TipoCambio.URL_LISTA_TIPO_CAMBIO;
    }

    public void eliminar(ActionEvent actionEvent) {
    }

    public String aceptar() {
        try {
            servicioTipoCambio.actualizarTipoCambio(bkTipoCambio.getTipoCambioFormulario());
            bkTipoCambio.setTipoCambioFormulario(servicioTipoCambio.conseguirTipoCambioPorId(1));
            bkTipoCambio.setListaTipoCambiosActivos(servicioTipoCambio.listarTipoCambiosActivos());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.TipoCambio.URL_LISTA_TIPO_CAMBIO;
    }
    
    public void marcarInicio(DateSelectEvent event) {
        bkTipoCambio.setFechaInicio(event.getDate());
    }
    
    public void marcarFinal(DateSelectEvent event) {
        bkTipoCambio.setFechaFinal(event.getDate());
    }
    

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.TipoCambio.URL_LISTA_TIPO_CAMBIO;
        //return mostrarMantenimiento();
    }
}
